#!/bin/bash
# 文件名：find_partition_by_uuid.sh
# 功能说明：
# 本脚本用于查找指定 PARTUUID 对应的分区设备路径，适用于多种 Linux 发行版。
#
# 实现方式：
# 1. 使用 blkid 查找 PARTUUID（适用于大多数系统）
# 2. 使用 lsblk 查找 PARTUUID（适用于支持 lsblk 命令的系统）
# 3. 使用 udev 设备路径（适用于 /dev/disk/by-partuuid/ 目录可用的系统）
#
# 使用方法：
# ./find_partition_by_uuid.sh <PARTUUID>
#
# 退出状态：
# - 0: 成功找到分区
# - 1: 目标 PARTUUID 未找到
# - 3: 未提供 PARTUUID 参数
#
# 兼容性：
# - 适用于大多数 GNU/Linux 发行版
# - 依赖于 blkid、lsblk 或 udev 设备路径中的至少一种方法
#
# 说明：
# - 当脚本被直接执行时，会依次尝试所有方法并输出结果。
# - 当脚本被以 source 方式导入时，仅导出查找函数，供其他脚本调用。

set -euo pipefail

# 方法 1：使用 blkid
find_partition_blkid() {
    local PART_UUID="$1"
    local INFO
    INFO=$(blkid | grep -m1 "PARTUUID=\"$PART_UUID\"" || true)

    if [[ -n "$INFO" ]]; then
        local BLK_DEVICE
        BLK_DEVICE=$(echo "$INFO" | cut -d: -f1)
        echo "$BLK_DEVICE"
    else
        return 1
    fi
}

# 方法 2：使用 lsblk
find_partition_lsblk() {
    local PART_UUID="$1"
    local BLK_DEVICE

    BLK_DEVICE=$(lsblk -rno NAME,PARTUUID | awk -v uuid="$PART_UUID" '$2 == uuid {print "/dev/"$1}' | tr -d '[:space:]')

    if [[ -n "$BLK_DEVICE" ]]; then
        echo "$BLK_DEVICE"
    else
        return 1
    fi
}

# 方法 3：使用 udev (/dev/disk/by-partuuid/)
find_partition_udev() {
    local PART_UUID="$1"
    local LINK_PATH="/dev/disk/by-partuuid/$PART_UUID"

    if [[ -e "$LINK_PATH" ]]; then
        readlink -f "$LINK_PATH"
    else
        return 1
    fi
}

# 主函数：当脚本被直接执行时，测试所有方法
main() {
    if [[ -z "${1:-}" ]]; then
        echo "Usage: $0 <PARTUUID>"
        exit 3
    fi

    local PART_UUID="$1"
    local RESULT

    echo "Testing all methods for PARTUUID: $PART_UUID"

    echo -e "\n[Method: blkid]"
    RESULT=$(find_partition_blkid "$PART_UUID") && echo "Found: $RESULT" || echo "Not found"

    echo -e "\n[Method: lsblk]"
    RESULT=$(find_partition_lsblk "$PART_UUID") && echo "Found: $RESULT" || echo "Not found"

    echo -e "\n[Method: udev]"
    RESULT=$(find_partition_udev "$PART_UUID") && echo "Found: $RESULT" || echo "Not found"
}

# 当脚本被直接运行时，执行主函数
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
else
    # 仅导出 find_partition_ 相关函数
    export -f find_partition_blkid
    export -f find_partition_lsblk
    export -f find_partition_udev
fi
